package Server;

import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class IniciarServer {

    private static ServerSocket serverSocket;
    private static int puerto = 9000;
    private static boolean usuarioConectado;
    private static String ficheroDeUsuarios = "Usuarios.txt";

    public static void main(String args[]) {
        inicializarFicheroDeUsuario(ficheroDeUsuarios);
        arrancarServer();
    }

    public static String dameFicheroUsuarios() {
        return ficheroDeUsuarios;
    }

    private static void inicializarFicheroDeUsuario(String ficheroDeUsuarios) {

        File archivo = new File(ficheroDeUsuarios);
        FileReader fr;
        BufferedReader br;

        try {
            if (!archivo.exists()) {
                archivo.createNewFile();
            }
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);
            String linea;
            boolean existe = false;
            while ((linea = br.readLine()) != null) {
                if (linea.equals("admin")) {
                    existe = true;
                }
                linea = br.readLine();
            }
            if (!existe) {
                OpcionesDelServidor.crearUsuarios("admin", "admin", "true", ficheroDeUsuarios);
                OpcionesDelServidor.crearUsuarios("manue", "manue", "false", ficheroDeUsuarios);

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void arrancarServer() {

        Socket cliente = null;
        try {
            serverSocket = new ServerSocket(puerto);
            while (true) {
                usuarioConectado = true;
                cliente = serverSocket.accept();
                conexion connection = new conexion(cliente);
                connection.start();

            }
        } catch (Exception e) {
            e.printStackTrace();

        }

    }

    static class conexion extends Thread {

        private Socket cliente;
        private PrintWriter salida;
        private BufferedReader entrada;

        public conexion(Socket cliente) {
            this.cliente = cliente;
        }

        @Override
        @SuppressWarnings("CallToThreadDumpStack")
        public void run() {
            try {
                salida = new PrintWriter(cliente.getOutputStream(), true);
                //salida.println("Bienvenido al servidor\n\n");
                //salida.flush();
                entrada = new BufferedReader(new InputStreamReader(cliente.getInputStream()));
                while (usuarioConectado) {
                    String textoRecibido = entrada.readLine();
                    opcionesDelServer(textoRecibido);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    cliente.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        private void opcionesDelServer(String textoRecibido) {
            switch (textoRecibido) {
                case "login":
                    OpcionesDelServidor.recibirDatosUsuarioLogin(salida, entrada);
                    break;
                case "subirArchivo":
                        System.out.println("menu antes del try");
                    try {
                        System.out.println("estoy en menu");
                        String archivoASubir = entrada.readLine();
                        String directorioDestino = entrada.readLine();
                        System.out.println("recibo los 2");
                        OpcionesDelServidor.subirArchivo(archivoASubir, directorioDestino, entrada);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case "descargarArchivo":
                    try {
                        String archivoADescargar = entrada.readLine();
                        OpcionesDelServidor.descargarArchivo(archivoADescargar, entrada, salida);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
                case "borrarFichero":
                    break;
                case "crearDirectorio":
                    break;
                case "borrarDirectorio":
                    break;
                case "crearUsuario":
                    break;
                case "borrarUsuario":
                    break;
                case "listarServidor":
                    OpcionesDelServidor.enviarListaDirectorio(salida, entrada);
                    break;
                case "listarFicheros":
                    OpcionesDelServidor.enviarDatosFichero(salida, entrada);
                    break;
                case "salir":
                    usuarioConectado = false;
                    salida.println("Hasta luego");
                    break;
            }


        }
    }
}